Shared Cryptext frame engine - build 30
======================================
frame.c is freestanding C compiled with the Microsoft x64 ABI. It uses only
an explicit Win32 function table. No CRT, mutable globals, extra DLL or
executable heap allocation is needed by the shipped application. Per-window
state uses LocalAlloc and is released at WM_NCDESTROY.

Rebuild on Linux with gcc/binutils:
    bash scr/frame_skin/build.sh
The resulting scr/src/frame_blob.bin is included in the package, so ordinary
Windows FASM builds continue to work without installing another compiler.
The EXE includes that byte sequence directly; the optional DLL includes the
same bytes through src/frame_blob.S. Changing frame.h's API list requires
updating src/frame_data.asm and the frame_api allocation in workspace_bss.asm.

DLL rebuild: existing scr/fido2_dll/build.sh, now also compiling frame_adapter.c
and frame_blob.S and linking Windows system GUI libraries. Non-system FIDO2
libraries remain static. Resource version lives in fido2_dll/src/dialog.rc.

Win11: DWMWA_CAPTION_COLOR support selects native captions and border/text colors.
Win10: a window subclass handles non-client layout/paint/hit testing. It keeps
WS_CAPTION and the system menu semantics, preserves the existing client size
and origin, and allocates the 21/3-pixel border outside that client rectangle.
NoSkin=1, carried from the EXE's existing registry setting, disables this
custom fallback. The DLL inherits theme/NoSkin through the owner chain.
The registry is read at process start, as before. No registry writes added.

Theme toggles repaint existing same-thread top-level windows, including the
DLL dialog; newly opened windows inherit the current selection. Scoped CBT
hooks cover app MessageBox/common file dialogs. Windows Security/UAC and other
process windows are not skinned. No hooks in a hardware/CTAP worker thread.

Verification: tests/test_frame_skin.py executes the exact blob with MS-ABI
Win32 test doubles. tests/test_frame_integration.py checks packaged PE binaries,
import-table ABI order, byte-identical EXE/DLL embedding and VERSIONINFO.
No real Windows GUI test was available in the build environment.

Microsoft API references:
https://learn.microsoft.com/windows/win32/dwm/customframe
https://learn.microsoft.com/windows/win32/winmsg/wm-nccalcsize
https://learn.microsoft.com/windows/win32/winmsg/wm-ncpaint
https://learn.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute
